/**
 * 关键字数据服务
 * 提供关键字数据的生成和管理功能
 */
import type { KeywordData } from './types'
import { GLOBAL_CONSTANTS, LANGUAGE_KEYWORDS, IGNORE_CASE_KEYWORDS } from './constants'

/**
 * 获取全局关键字的详细描述
 * @param keyword 关键字
 * @returns 关键字的详细描述
 */
const getGlobalKeywordDescription = (keyword: string): string => {
	// 使用类型断言解决索引问题
	const details = (GLOBAL_CONSTANTS.details as Record<string, any>)[keyword]
	if (details) {
		return `${details.description} (${details.type})`
	}
	return '全局系统变量'
}

/**
 * 获取关键字类型的描述
 * @param type 关键字类型
 * @returns 类型的中文描述
 */
const getKeywordTypeDescription = (type: string): string => {
	const descriptions: Record<string, string> = {
		'syntax': '语法结构',
		'types': '数据类型',
		'control': '流程控制',
		'operation': '数据操作'
	}
	return descriptions[type] || type
}

/**
 * 获取关键字的详细描述
 * @param type 关键字类型
 * @param keyword 关键字
 * @returns 关键字的详细描述
 */
const getKeywordDescription = (type: string, keyword: string): string => {
	// 这里可以添加更详细的关键字说明
	const descriptions: Record<string, Record<string, string>> = {
		'syntax': {
			'IMPORT': '导入外部模块或库',
			'SCHEMA': '定义数据库架构',
			'DEFINE': '定义变量或常量',
			'RECORD': '定义记录结构',
			'FUNCTION': '定义函数',
			'CALL': '调用函数或过程'
			// TODO: 其他语法关键字描述
		},
		'types': {
			'STRING': '字符串类型，用于存储文本数据',
			'INTEGER': '整数类型，用于存储整数值',
			'FLOAT': '浮点数类型，用于存储小数',
			'DATE': '日期类型，用于存储日期值',
			'BOOLEAN': '布尔类型，用于存储真/假值'
			// TODO: 其他类型关键字描述
		},
		'control': {
			'IF': '条件语句，用于根据条件执行不同代码',
			'FOR': '循环语句，用于重复执行代码块',
			'WHILE': '循环语句，当条件为真时重复执行',
			'RETURN': '返回语句，用于从函数返回值'
		},
		'operation': {
			'SELECT': '查询语句，用于从数据库检索数据',
			'INSERT': '插入语句，用于向数据库添加新记录',
			'UPDATE': '更新语句，用于修改数据库中的记录',
			'DELETE': '删除语句，用于从数据库删除记录'
		}
		// TODO: 可以继续添加其他类型的描述
	}
	return descriptions[type]?.[keyword] || `${type} 类型的关键字`
}

/**
 * 获取关键字的使用场景
 * @param type 关键字类型
 * @param keyword 关键字
 * @returns 关键字的使用场景描述
 */
const getKeywordUsage = (type: string, keyword: string): string => {
	const usages: Record<string, string> = {
		'syntax': '用于程序结构定义和语法组成',
		'types': '用于变量和字段的数据类型声明',
		'control': '用于程序流程控制和逻辑判断',
		'operation': '用于数据操作和数据库查询'
	}
	return usages[type] || '通用场景'
}

/**
 * 生成关键字补全数据
 * 为每个关键字生成补全项信息
 * @returns 包含所有关键字补全信息的数组
 */
export const generateKeywordData = (): KeywordData[] => {
	const keywordMap = new Map<string, KeywordData>()

	// 处理全局变量关键字
	GLOBAL_CONSTANTS.keywords.forEach((keyword, index) => {
		keywordMap.set(keyword.toUpperCase(), {
			label: keyword,
			data: index + 1,
			detail: `${GLOBAL_CONSTANTS.config.description} - ${getGlobalKeywordDescription(keyword)}`,
			documentation: [
				`类型: ${GLOBAL_CONSTANTS.config.type}`,
				`描述: ${getGlobalKeywordDescription(keyword)}`,
				`使用场景: 可在程序任意位置使用的全局变量`,
				`大小写敏感: ${GLOBAL_CONSTANTS.config.caseSensitive ? '是' : '否'}`
			].join('\n')
		})
	})

	// 处理语言关键字
	Object.entries(LANGUAGE_KEYWORDS).forEach(([type, keywords]) => {
		keywords.forEach((keyword, index) => {
			const upperKeyword = keyword.toUpperCase()
			// 避免重复添加
			if (!keywordMap.has(upperKeyword)) {
				keywordMap.set(upperKeyword, {
					label: upperKeyword,
					data: keywordMap.size + 1,
					detail: `${getKeywordTypeDescription(type)} - ${keyword}`,
					documentation: [
						`类型: ${type}`,
						`描述: ${getKeywordDescription(type, keyword)}`,
						`使用场景: ${getKeywordUsage(type, keyword)}`,
						`大小写敏感: ${!isIgnoreCaseKeyword(keyword)}`
					].join('\n')
				})
			}
		})
	})

	return Array.from(keywordMap.values())
}

/**
 * 判断是否为忽略大小写的关键字
 * @param keyword 关键字
 * @returns 是否为忽略大小写的关键字
 */
export const isIgnoreCaseKeyword = (keyword: string): boolean =>
	IGNORE_CASE_KEYWORDS.has(keyword.toLowerCase())

/**
 * 获取所有关键字列表（大写形式）
 * @returns 所有关键字的数组
 */
export const getKeys = (): string[] => {
	const allKeywords = [
		...GLOBAL_CONSTANTS.keywords,
		...Object.values(LANGUAGE_KEYWORDS).flat()
	]

	// 去重并转换为大写
	return [...new Set(allKeywords.map(k => k.toUpperCase()))]
}

/**
 * 获取忽略大小写的关键字列表（数组形式）
 * @returns 忽略大小写的关键字数组
 */
export const getIgnoreKeys = (): string[] => {
	return [...IGNORE_CASE_KEYWORDS]
}

/**
 * 初始化关键字数据
 * 生成所有关键字的补全数据
 */
export const keywordData: KeywordData[] = generateKeywordData()

export default keywordData